<!DOCTYPE html>
<html lang="zh-CN">

<head>
	<meta charset="UTF-8">
	<meta name="author" content="wangbo">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Document</title>
</head>

<body>
	<script>
		// // 值是否相等，只有两个运算符：相等运算符（ == ）和严格相等运算符（ === ）。
		// Object.is('foo', 'foo')
		// // true
		// Object.is({}, {})
		// //// false
		// console.log(NaN === NaN)
		// Object.is(NaN, NaN) // true



		// let obj = {}
		// Object.defineProperty(obj, 'name', {
		// 	value: 'zhangsan'
		// })
		// obj.name = 'lisi'
		// delete obj.name
		// console.log(obj);

		// // configurable：true | false 默认为false当值为true时属性可以被删除
		// // writable：true | false 默认为false 当值为true时属性可以被修改
		// Object.defineProperty(obj, 'name', {
		// 	value: 'zhangsan',
		// 	configurable: true,
		// 	writable: true
		// })


		let obj = {}
		let name = "李四"
		Object.defineProperty(obj, 'name', {
			configurable: true,
			enumerable: true,
			get() {
				return name
			},
			set(val) {
				name = val
			}
		})
		// obj.name = 'lisi'

		console.log(obj.name);

		// Object.assign 方法用于对象的合并，将源对象（source）的所有可枚举属性，复制到目标对象（target）。
		// 如果目标对象与源对象有同名属性，或多个源对象有同名属性，则后面的属性会覆盖前面的属性。
		// 如果只有一个参数， Object.assign 会直接返回该参数。
		var target = { a: 1 };
		var source1 = { b: 2 };
		var source2 = { c: 3 };
		Object.assign(target, source1, source2);
		// target // {a:1, b:2, c:3}

		// 如果该参数不是对象，则会先转成对象，然后返回。
		// "object"
		console.log(Object.assign(2));
		// Object.assign 可以用来处理数组，但是会把数组视为对象。
		// Object.assign([1, 2, 3], [4, 5])
		Object.assign(SomeClass.prototype, {
			someMethod(arg1, arg2) {
			},
			anotherMethod() {
			}
		});
		// 等同于下面的写法
		SomeClass.prototype.someMethod = function (arg1, arg2) {
		};
		SomeClass.prototype.anotherMethod = function () {
		};
		// 克隆对象
		function clone(origin) {
			return Object.assign({}, origin);
		}
	</script>
</body>

</html>